<?php
class ToolsAction extends BaseAction
{


	// 标签列表（close-普通闭合标签；selfClose-自闭合标签）
	static private $tag_list = array(
		'div'	=>	'close'
	);


	/* 导入地图
	 *
	 */
	public function import_map()
	{
		set_time_limit(0);
		// 获取地图相关配置
		$map_conf = C('MAP');
		// 获取地图名字
		$map_name = strval( trim($_GET['map']) );
		if(!$map_name)
		{
			trigger_error('未指定地图', E_USER_ERROR);
		}
		// 获取地图文件
		$file = $map_conf['save_path'] . $map_name . $map_conf['extension'];
		if( !file_exists($file) )
		{
			trigger_error('地图不存在', E_USER_ERROR);
		}
		$file_contents = file($file);
		if(!$file_contents)
		{
			trigger_error('读取地图失败', E_USER_ERROR);
		}
		// HTML属性列表
		$attr_list = array(
			'class',
			'title'
		);
		// 将HTML解析为数组
		$html_dom_arr = $this->get_DOM_arr($file_contents, $attr_list);
		// 循环处理数据
		$sum = 0;
		foreach($html_dom_arr as $m=>$n)
		{
			// 切割字符串
			preg_match('/^(.+) 纬度(.+)，经度(.+)$/', $n['title'], $matches);
			// 处理名称
			$n['name'] = $matches['1'];
			// 处理纬度
			$n['lat'] = $matches['2'];
			// 处理经度
			$n['lng'] = $matches['3'];
			// 计算数据MD5值
			$md5 = md5($map_name . $n['name'] . $n['class'] . $n['lng'] . $n['lat']);
			// 查重
			$where_check_exist['md5'] = array('eq', $md5);
			$check_exist = D('map')->where($where_check_exist)->find();
			if($check_exist)
			{
				// 复查，防止经纬度颠倒造成的假性重复
				if($map_name==$check_exist['map_name'] && $n['name']==$check_exist['name'] && $n['class']==$check_exist['class'] && $n['lng']==$check_exist['lng'] && $n['lat']==$check_exist['lat'])
				{
					$err[] = '跳过重复数据：' . $n['title'] . ' [MD5]' . $md5 . '<br />';
					continue;
				}
			}
			// 插入数据
			$data_add_record['map_name'] = $map_name;
			$data_add_record['name'] = $n['name'];
			$data_add_record['class'] = $n['class'];
			$data_add_record['lng'] = $n['lng'];
			$data_add_record['lat'] = $n['lat'];
			$add_record = D('map')->add($data_add_record);
			if($add_record)
			{
				$sum++;
			}
			else
			{
				$err[] = '数据写入失败：' . $n['title'] . '<br />';
			}
		}
		// 输出结果
		if($err)
		{
			dump($err);
			echo '<br />';
		}

		echo '数据导入完成 ' . $sum . '/' . count($html_dom_arr);
	}


	/* 获取DOM数组
	 *
	 */
	private function get_DOM_arr($file_contents, $attr_list)
	{
		$file_contents = (array)$file_contents;
		$attr_list = (array)$attr_list;
		foreach($file_contents as $m=>$n)
		{
			// 获取HTML内容为字符串，并从空格处打散为数组
			$str = trim($n);
			$html_arr = explode(' ', $str);
			// 判断是否为HTML标签
			if($str[0] != '<')
			{
				// 不是HTML标签则跳过此行
				continue;
			}
			// 获取标签名
			$tag_name = substr($html_arr[0], 1);
			// 生成标签头
			$tag_start = '<' . $tag_name;
			// 获取标签闭合属性
			$tag_close_attr = self::$tag_list[$tag_name];
			// 生成标签结尾
			switch($tag_close_attr)
			{
				case 'close':
					$tag_end = '</' . $tag_name . '>';
					break;
				case 'selfClose':
					$tag_end = '/>';
					break;
			}
			// 剥离标签头尾
			$str = trim($str, $tag_start);
			$str = trim($str, $tag_end);
			// 按属性重新分割
			$html_arr = array();
			foreach($attr_list as $h=>$i)
			{
				// 获取被匹配字符串的末位索引
				$pos = strpos($str, $i);
				$pos += strlen($i);
				$pos--;
				// 获取自索引开始的第一个等号的索引
				for($index=$pos; $index<strlen($str); $index++)
				{
					if($str[$index] === '=')
					{
						$equal_index = $index;
						break;
					}
				}
				// 获取自索引开始第一对引号（英文半角，单引号或双引号）的索引
				$sum = 0;
				for($index=$equal_index; $index<strlen($str); $index++)
				{
					if( ($str[$index] === '"') || ($str[$index] === "'") )
					{
						$tmp[] = $index;
						$sum++;
						if($sum == 2)
						{
							$quota_index_start = $tmp[0];
							$quota_index_end = $tmp[1];
							unset($tmp);
							break;
						}
					}
				}
				// 保存为数组
				$res_arr[$m]['tag_name'] = $tag_name;
				$res_arr[$m][$i] = substr($str, $quota_index_start+1, $quota_index_end-$quota_index_start-1);
			}
		}
		return $res_arr;
	}


}
